package com.tedu.udm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tedu.udm.ex.ServiceException;
import com.tedu.udm.mapper.PermissionMapper;
import com.tedu.udm.mapper.RolePermissionMapper;
import com.tedu.udm.pojo.dto.PermissionAddNewDTO;
import com.tedu.udm.pojo.entity.Permission;
import com.tedu.udm.pojo.entity.Role;
import com.tedu.udm.pojo.entity.RolePermission;
import com.tedu.udm.pojo.entity.UserRole;
import com.tedu.udm.pojo.vo.PermissionListItemVO;
import com.tedu.udm.pojo.vo.RoleListItemVO;
import com.tedu.udm.service.IPermissionService;
import com.tedu.udm.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class PermissionServiceImpl implements IPermissionService {
    @Autowired
    PermissionMapper permissionMapper;
    @Autowired
    RolePermissionMapper rolePermissionMapper;
    /**
     * 添加权限
     *
     * @return 权限
     */
    public void addNew(PermissionAddNewDTO permissionAddNewDTO) {
        log.debug("开始处理【添加权限】的业务，参数：{}", permissionAddNewDTO);

        log.debug("即将检查权限名是否被占用……");
        {
            // 从参数对象中获取username
            String permissionName = permissionAddNewDTO.getPermissionName();
            // 调用permissionMapper的countByUsername()方法执行统计查询
            QueryWrapper<Permission> wrapper = new QueryWrapper<>();
            wrapper.eq("permission_name",permissionName);
            int count = permissionMapper.selectCount(wrapper);
            // 判断统计结果是否不等于0
            if (count != 0) {
                // 是：抛出异常
                String message = "添加权限失败，权限名【" + permissionName + "】已经被占用！";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建Permission对象
        Permission permission = new Permission();
        // 通过BeanUtils.copyProperties()方法将参数对象的各属性值复制到User对象中
        BeanUtils.copyProperties(permissionAddNewDTO, permission);
        // 调用permissionMapper的insert()方法插入数据
        log.debug("即将插入权限数据，参数：{}", permission);
        int rows = permissionMapper.insert(permission);
        // 判断插入数据的结果是否符合预期
        if (rows != 1) {
            String message = "添加权限失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void addNewWithRole(Long roleId, PermissionAddNewDTO permissionAddNewDTO) {
        log.debug("开始处理【添加角色权限】的业务，参数：{}", permissionAddNewDTO);

        log.debug("即将检查权限名是否被占用……");
        {
            // 从参数对象中获取username
            String permissionName = permissionAddNewDTO.getPermissionName();
            // 调用permissionMapper的countByUsername()方法执行统计查询
            QueryWrapper<Permission> wrapper = new QueryWrapper<>();
            wrapper.eq("permission_name",permissionName);
            int count = permissionMapper.selectCount(wrapper);
            // 判断统计结果是否不等于0
            if (count != 0) {
                // 是：抛出异常
                String message = "添加权限失败，权限名【" + permissionName + "】已经被占用！";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建Permission对象
        Permission permission = new Permission();
        // 通过BeanUtils.copyProperties()方法将参数对象的各属性值复制到User对象中
        BeanUtils.copyProperties(permissionAddNewDTO, permission);
        // 调用permissionMapper的insert()方法插入数据
        log.debug("即将插入权限数据，参数：{}", permission);
        int rows = permissionMapper.insert(permission);
        // 判断插入数据的结果是否符合预期
        if (rows != 1) {
        }

        log.debug("添加权限完成，准备开始添加角色权限");
        RolePermission rolePermission = new RolePermission();
        rolePermission.setRoleId(roleId);
        rolePermission.setPermissionId(permission.getId());
        int row = rolePermissionMapper.insert(rolePermission);
        if (row != 1) {
            String message = "添加权限失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【删除权限】的业务，参数：{}", id);

        // 调用adminMapper的AdminStandardVO getStandardById(Long id)方法执行查询
        {
            Permission queryResult = permissionMapper.selectById(id);
            // 判断查询结果是否为null
            if (queryResult == null) {
                // 是：抛出异常（ERR_NOT_FOUND）
                String message = "删除权限失败，尝试删除的权限数据不存在！";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }
        {
            QueryWrapper wrapper = new QueryWrapper();
            wrapper.eq("permission_id",id);
            RolePermission queryResult = rolePermissionMapper.selectOne(wrapper);
            if (queryResult == null) {
                // 是：抛出异常（ERR_NOT_FOUND）
                String message = "删除权限失败，存在与本权限关联的用户数据，请先修改相关用户权限！";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        // 调用adminMapper的int deleteById(Long id)执行删除，并获取返回的行数
        int rows = permissionMapper.deleteById(id);
        // 判断返回的行数是否不为1
        if (rows != 1) {
            // 是：抛出异常（ERR_DELETE：服务器忙）
            String message = "删除权限失败，服务器忙，请稍后再尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }
    /**
     * 查询权限列表
     *
     * @return 权限列表
     */
    public List<PermissionListItemVO> list() {
        log.debug("开始处理【查询权限列表】的业务，无参数");
        List<Permission> permissions = permissionMapper.selectList(null);
        List<PermissionListItemVO> list = new ArrayList<>();
        for (Permission permission: permissions) {
            PermissionListItemVO permissionListItemVO = new PermissionListItemVO();
            BeanUtils.copyProperties(permission,permissionListItemVO);
            list.add(permissionListItemVO);
        }
        return list;
    }

    /**
     * 根据角色查询权限列表
     *
     * @return id 角色id
     */
    public List<PermissionListItemVO> listByRoleId(Long roleId) {
        log.debug("开始处理【根据角色查询权限列表】的业务，无参数");
        List<PermissionListItemVO> permissions = permissionMapper.selectByRoleId(roleId);
        return permissions;
    }
}
